home *** CD-ROM | disk | FTP | other *** search
- /* GadgetTools.c */
- /* 02 Aug 1996 15:38:06 */
-
- #ifndef BACKUP_INCLUDE
- #include "IncludeAll.c"
- #endif
- #include "Backup.h"
- #include "Backup_proto.h"
- #include <gadgets/NoteBook.h>
- #include <gadgets/FrameGad.h>
- #include <gadgets/ALVGadget.h>
- #include <gadgets/PcBar.h>
- #include "BackupStrings.h"
-
-
- /* aus Backup_Window.c */
- extern APTR vi; /* VisualInfo */
- extern struct DrawInfo *myDrawInfo;
- extern struct Screen *WBScreen;
-
-
- static BOOL AddGadgetShort(const char *Text, struct Gadget *Gad, UWORD GadgetType, struct GadgetShort *gShort);
- static struct GadgetShortInfo *GetGadgetShortInfo(const char *Text, struct GadgetShort *gShort);
-
-
- void ActivateStringGadget(struct Window *Win, struct Requester *Req, struct Gadget **Gad)
- {
- ASSERT_VALID(Win);
- ASSERT_VALID0(Req);
- ASSERT_VALID(Gad);
-
- if (*Gad)
- ActivateGadget(*Gad, Win, Req);
- }
-
-
- void myOnOffGadget(struct Gadget *Gad, struct Window *Win, struct Requester *Req, short On)
- {
- UWORD Pos;
-
- ASSERT_VALID0(Win);
- ASSERT_VALID0(Req);
- ASSERT_VALID(Gad);
-
- if (((Gad->Flags & GFLG_DISABLED) && !On) ||
- (!(Gad->Flags & GFLG_DISABLED) && On) )
- return;
-
- if (Win)
- {
- Pos = RemoveGList(Win, Gad, 1);
- if (Pos == ~0)
- return;
- }
- if (On)
- {
- struct RastPort *rp;
-
- Gad->Flags &= ~GFLG_DISABLED;
-
- /* Boolean-Gadgets ohne Images jetzt löschen */
- if (Win && (Gad->GadgetType & GTYP_GTYPEMASK) == GTYP_BOOLGADGET
- && !(Gad->Flags & GFLG_GADGIMAGE))
- {
- short Left, Top;
-
- Left = GetGadgetLeftEdge(Win, Req, Gad);
- Top = GetGadgetTopEdge(Win, Req, Gad);
-
- rp = Req ? Req->ReqLayer->rp : Win->RPort;
- EraseRect(rp, Left, Top,
- Left + Gad->Width - 1,
- Top + Gad->Height - 1);
- }
- }
- else
- Gad->Flags |= GFLG_DISABLED;
-
- if (Win)
- {
- AddGList(Win, Gad, Pos, 1, Req);
-
- RefreshGList(Gad, Win, Req, 1);
- }
- }
-
-
- void SetScroller(struct Window *Win, struct Requester *Req, struct Gadget *Gad,
- short visibleLines, short totalLines, short TopLine, short Overlap)
- {
- struct PropInfo *prop;
- unsigned short hidden;
- USHORT VertBody, VertPot;
-
- ASSERT_VALID(Win);
- ASSERT_VALID0(Req);
- ASSERT_VALID(Gad);
-
- TopLine = max(TopLine, 0);
-
- hidden = max(totalLines - visibleLines, 0);
- if (TopLine > hidden)
- TopLine = hidden;
-
- if (hidden > 0)
- {
- VertBody = (USHORT) (((ULONG) (visibleLines-Overlap) * MAXBODY) /
- (totalLines - Overlap) );
- VertPot = (USHORT) (((ULONG) TopLine * MAXPOT) / hidden);
- }
- else
- {
- VertBody = MAXBODY;
- VertPot = 0;
- }
-
- prop = (struct PropInfo *) Gad->SpecialInfo;
- NewModifyProp(Gad, Win, Req, prop->Flags,
- 0, VertPot, 0, VertBody, 1 );
- }
-
-
- short GetScroller(const struct Gadget *Gad, short visibleLines, short totalLines)
- {
- struct PropInfo *prop;
- UWORD hidden;
-
- ASSERT_VALID(Gad);
- prop = (struct PropInfo *) Gad->SpecialInfo;
- hidden = max(totalLines - visibleLines, 0);
- return (short) ((((ULONG) hidden * prop->VertPot) + (MAXPOT/2)) / MAXPOT);
- }
-
-
- short GetGadgetLeftEdge(const struct Window *Win, const struct Requester *Req,
- const struct Gadget *Gad)
- {
- short LeftEdge;
-
- ASSERT_VALID0(Win);
- ASSERT_VALID0(Req);
- ASSERT_VALID(Gad);
-
- LeftEdge = Gad->LeftEdge;
- if (Gad->Flags & GFLG_RELRIGHT)
- LeftEdge += (Req ? Req->Width : Win->Width) - 1;
-
- return LeftEdge;
- }
-
-
- short GetGadgetTopEdge(const struct Window *Win, const struct Requester *Req,
- const struct Gadget *Gad)
- {
- short TopEdge;
-
- ASSERT_VALID0(Win);
- ASSERT_VALID0(Req);
- ASSERT_VALID(Gad);
-
- TopEdge = Gad->TopEdge;
- if (Gad->Flags & GFLG_RELBOTTOM)
- TopEdge += (Req ? Req->Height : Win->Height) - 1;
-
- return TopEdge;
- }
-
-
- short GetGadgetWidth(const struct Window *Win, const struct Requester *Req,
- const struct Gadget *Gad)
- {
- short Width;
-
- ASSERT_VALID0(Win);
- ASSERT_VALID0(Req);
- ASSERT_VALID(Gad);
-
- Width = Gad->Width;
- if (Gad->Flags & GFLG_RELWIDTH)
- Width += (Req ? Req->Width : Win->Width);
-
- return Width;
- }
-
-
- short GetGadgetHeight(const struct Window *Win, const struct Requester *Req,
- const struct Gadget *Gad)
- {
- short TopEdge;
-
- ASSERT_VALID0(Win);
- ASSERT_VALID0(Req);
- ASSERT_VALID(Gad);
-
- TopEdge = Gad->Height;
- if (Gad->Flags & GFLG_RELHEIGHT)
- TopEdge += Req ? Req->Height : Win->Height;
-
- return TopEdge;
- }
-
-
- /* Größe und Position für NewWindow anhand des WorkBench-Screens anpassen. */
- void AdjustWindowSize(struct NewWindow *New)
- {
- ASSERT_VALID(New);
-
- New->Height = min(New->Height, WBScreen->Height);
- New->Width = min(New->Width, WBScreen->Width);
-
- New->TopEdge = min(New->TopEdge, WBScreen->Height - New->Height);
- New->LeftEdge = min(New->LeftEdge, WBScreen->Width - New->Width);
- }
-
-
- /* Window <InnerWin> innerhalb des Windows <Win> zentrieren
- Aufruf VOR OpenWindow() !!
- */
- void CenterWindow(const struct Window *Win, struct NewWindow *InnerWin)
- {
- ASSERT_VALID(Win);
- ASSERT_VALID(InnerWin);
-
- InnerWin->LeftEdge = Win->LeftEdge + (Win->Width - InnerWin->Width) / 2;
- InnerWin->TopEdge = Win->TopEdge + (Win->Height - InnerWin->Height) / 2;
- }
-
-
- /* Window <InnerWin> über dem Mauszeiger zentrieren
- Aufruf VOR OpenWindow() !!
- */
- void CenterWindowMouse(const struct Window *activeWin, struct NewWindow *InnerWin)
- {
- short MouseX, MouseY;
-
- ASSERT_VALID(activeWin);
- ASSERT_VALID(InnerWin);
-
- MouseX = activeWin->WScreen->MouseX;
- MouseY = activeWin->WScreen->MouseY;
-
- InnerWin->LeftEdge = MouseX - InnerWin->Width / 2;
- InnerWin->TopEdge = MouseY - InnerWin->Height / 2;
- }
-
-
- /* Border zeichnen */
- void myDrawBorder(struct Window *Win, struct Requester *Req,
- short Left, short Top, short Width, short Height, BOOL Recessed)
- {
- struct RastPort *rp;
-
- ASSERT_VALID(Win);
- ASSERT_VALID0(Req);
-
- rp = Req ? Req->ReqLayer->rp : Win->RPort;
-
- DrawBevelBox(rp, Left, Top, Width, Height,
- GTBB_FrameType, BBFT_BUTTON,
- Recessed ? GTBB_Recessed : TAG_IGNORE, TRUE,
- GT_VisualInfo, vi,
- TAG_END );
- }
-
-
- void CheckMenuItem(struct Menu *theMenu, void *MenuId, BOOL Check)
- {
- UWORD MenuNum = FindMenuItem(theMenu, MenuId);
- struct MenuItem *Item;
-
- Item = ItemAddress(theMenu, MenuNum);
-
- if (Item)
- {
- if (Check)
- Item->Flags |= CHECKED;
- else
- Item->Flags &= ~CHECKED;
- }
- }
-
-
- UWORD FindMenuItem(struct Menu *theMenu, void *MenuId)
- {
- UWORD MenuNr, ItemNr, SubNr;
- struct MenuItem *Item, *SubItem;
-
- MenuNr = 0;
- while (theMenu)
- {
- if (GTMENU_USERDATA(theMenu) == MenuId)
- return (UWORD) FULLMENUNUM(MenuNr, NOITEM, NOSUB);
-
- ItemNr = 0;
- Item = theMenu->FirstItem;
- while (Item)
- {
- if (GTMENUITEM_USERDATA(Item) == MenuId)
- return (UWORD) FULLMENUNUM(MenuNr, ItemNr, NOSUB);
-
- SubNr = 0;
- SubItem = Item->SubItem;
- while (SubItem)
- {
- if (GTMENUITEM_USERDATA(SubItem) == MenuId)
- return (UWORD) FULLMENUNUM(MenuNr, ItemNr, SubNr);
-
- SubItem = SubItem->NextItem;
- SubNr++;
- }
- Item = Item->NextItem;
- ItemNr++;
- }
- theMenu = theMenu->NextMenu;
- MenuNr++;
- }
-
- return (UWORD) FULLMENUNUM(NOMENU, NOITEM, NOSUB);
- }
-
-
- BOOL CreateGadgetShort(struct GadgetShort **gShort)
- {
- DestroyGadgetShort(gShort);
-
- *gShort = calloc(sizeof(struct GadgetShort), 1); // MUSS mit 0 vorbelegt sein!
-
- return (BOOL) (NULL != *gShort);
- }
-
-
- void DestroyGadgetShort(struct GadgetShort **gShort)
- {
- if (*gShort)
- {
- free(*gShort);
- *gShort = NULL;
- }
- }
-
-
- BOOL EnterGadgetShort(const struct NewGadget *ng, UWORD GadgetType, ULONG *GadgetTags,
- struct Gadget *Gad, struct GadgetShort *gShort)
- {
- BOOL Result;
- struct TagItem *Tag;
-
- ASSERT_VALID(ng);
- ASSERT_VALID(gShort);
- ASSERT_VALID(GadgetTags);
-
- if (NULL == Gad)
- return TRUE;
-
- Result = TRUE;
-
- switch (GadgetType)
- {
- case MX_KIND:
- Tag = FindTagItem(GTMX_Labels, (struct TagItem *) GadgetTags);
- if (Tag)
- {
- const char **p;
- short Index = 0;
-
- p = (const char **) Tag->ti_Data;
- while (Result && *p)
- {
- Result = AddGadgetShort(*p, Gad, GadgetType, gShort);
- if (Result)
- {
- struct GadgetShortInfo *gInfo;
-
- gInfo = GetGadgetShortInfo(*p, gShort);
- if (gInfo)
- {
- // in gi_Extra wird der Zählindex des Labels abgelegt!
- gInfo->gi_Extra = Index;
- }
- }
- p++;
- Index++;
- }
- }
- break;
-
- case NOTEBOOK_KIND:
- Tag = FindTagItem(NB_PageList, (struct TagItem *) GadgetTags);
- if (Tag)
- {
- struct NewNBPage *nPage;
- short Index = 0;
-
- nPage = (struct NewNBPage *) Tag->ti_Data;
- while (Result && nPage)
- {
- if (NBLT_Text == nPage->nn_LabelType)
- {
- Result = AddGadgetShort(nPage->nn_Label, Gad, GadgetType, gShort);
- if (Result)
- {
- struct GadgetShortInfo *gInfo;
-
- gInfo = GetGadgetShortInfo(nPage->nn_Label, gShort);
- if (gInfo)
- {
- // in gi_Extra wird der Zählindex der Page abgelegt!
- gInfo->gi_Extra = Index;
- }
- }
- }
- nPage = nPage->nn_NextPage;
- Index++;
- }
- }
- break;
-
- case LISTVIEW_KIND:
- Tag = FindTagItem(GTLV_ShowSelected, (struct TagItem *) GadgetTags);
- if (Tag && 0 != Tag->ti_Data)
- {
- // das verknüpfte String-Gadget eintragen!
- if (ng->ng_GadgetText)
- Result = AddGadgetShort(ng->ng_GadgetText, (struct Gadget *) Tag->ti_Data, STRING_KIND, gShort);
- }
- else
- {
- if (ng->ng_GadgetText)
- Result = AddGadgetShort(ng->ng_GadgetText, Gad, GadgetType, gShort);
- }
- break;
-
- case CYCLE_KIND:
- if (ng->ng_GadgetText)
- Result = AddGadgetShort(ng->ng_GadgetText, Gad, GadgetType, gShort);
-
- Tag = FindTagItem(GTCY_Labels, (struct TagItem *) GadgetTags);
- if (Tag && Result)
- {
- struct GadgetShortInfo *gInfo;
-
- gInfo = GetGadgetShortInfo(ng->ng_GadgetText, gShort);
- if (gInfo)
- {
- // in gi_Extra wird die Anzahl Labels abgelegt!
- const char **p;
-
- p = (const char **) Tag->ti_Data;
- gInfo->gi_Extra = 0;
- while (*p)
- {
- gInfo->gi_Extra++;
- p++;
- }
- }
- }
- break;
-
- default:
- if (ng->ng_GadgetText)
- Result = AddGadgetShort(ng->ng_GadgetText, Gad, GadgetType, gShort);
- break;
- }
-
- return Result;
- }
-
-
- static BOOL AddGadgetShort(const char *Text, struct Gadget *Gad, UWORD GadgetType, struct GadgetShort *gShort)
- {
- struct GadgetShortInfo *gInfo;
-
- gInfo = GetGadgetShortInfo(Text, gShort);
- if (gInfo)
- {
- if (NULL == gInfo->gi_Gadget)
- {
- gInfo->gi_Gadget = Gad;
- gInfo->gi_GadgetType = GadgetType;
- }
- else
- {
- // Dieses Kürzel wurde schon verwendet!
- return FALSE;
- }
- }
-
- return TRUE;
- }
-
-
- static struct GadgetShortInfo *GetGadgetShortInfo(const char *Text, struct GadgetShort *gShort)
- {
- const unsigned char *p;
-
- p = strchr(Text, '_');
- if (p)
- {
- unsigned char c;
-
- c = ToUpper(p[1]);
- return &gShort->gs_Info[c];
- }
-
- return NULL;
- }
-
-
- BOOL HandleGadgetShort(const struct GadgetShort *gShort, struct Window *Win,
- USHORT code, struct Hook *GadgetHandlerHook)
- {
- BOOL Found = FALSE;
- unsigned char c;
- const struct GadgetShortInfo *GSInfo;
-
- c = ToUpper(code);
- GSInfo = &gShort->gs_Info[c];
-
- if (GSInfo->gi_Gadget && !(GSInfo->gi_Gadget->Flags & GFLG_DISABLED))
- {
- // Tastatur-Kürzel für Gadget bearbeiten
- Found = TRUE;
-
- switch (GSInfo->gi_GadgetType)
- {
- case BUTTON_KIND:
- CallHook(GadgetHandlerHook, (Object *) GSInfo->gi_Gadget, (ULONG) code);
- break;
-
- case STRING_KIND:
- ActivateGadget(GSInfo->gi_Gadget, Win, NULL);
- break;
-
- case CYCLE_KIND:
- if (IntuitionBase->LibNode.lib_Version >= 39)
- {
- ULONG Active, MaxActive;
-
- // V39 !!!
- GT_GetGadgetAttrs(GSInfo->gi_Gadget,
- Win, NULL,
- GTCY_Active, &Active,
- TAG_END);
-
- MaxActive = GSInfo->gi_Extra;
- Active = (Active + 1) % MaxActive;
-
- GT_SetGadgetAttrs(GSInfo->gi_Gadget,
- Win, NULL,
- GTCY_Active, Active,
- TAG_END);
-
- CallHook(GadgetHandlerHook, (Object *) GSInfo->gi_Gadget, (ULONG) Active);
- }
- break;
-
- case MX_KIND:
- GT_SetGadgetAttrs(GSInfo->gi_Gadget,
- Win, NULL,
- GTMX_Active, GSInfo->gi_Extra,
- TAG_END);
-
- CallHook(GadgetHandlerHook, (Object *) GSInfo->gi_Gadget, (ULONG) GSInfo->gi_Extra);
- break;
-
- case CHECKBOX_KIND:
- GT_SetGadgetAttrs(GSInfo->gi_Gadget,
- Win, NULL,
- GTCB_Checked, !(GSInfo->gi_Gadget->Flags & GFLG_SELECTED),
- TAG_END);
-
- CallHook(GadgetHandlerHook, (Object *) GSInfo->gi_Gadget, (ULONG) (GSInfo->gi_Gadget->Flags & GFLG_SELECTED));
- break;
-
- case NOTEBOOK_KIND:
- SetGadgetAttrs(GSInfo->gi_Gadget,
- Win, NULL,
- NB_ActivePage, GSInfo->gi_Extra,
- TAG_END);
- CallHook(GadgetHandlerHook, (Object *) GSInfo->gi_Gadget, (ULONG) GSInfo->gi_Extra);
- break;
- }
- }
-
- return Found;
- }
-
-
- struct Gadget *CreateGadgetList(struct Gadget **GadgetListPtr, short NumGad,
- struct TextAttr *GadgetFontAttr,
- UWORD *GadgetTypes, struct NewGadget *NGad,
- struct Gadget **GadgetList, ULONG *GadgetTags,
- struct GadgetShort *gShort, struct MinList *ResourceList,
- ULONG ScaleX, ULONG ScaleY, UWORD OffsetX, UWORD OffsetY)
- {
- struct Gadget *gad;
- short n;
-
- gad = CreateContext(GadgetListPtr);
-
- for (n=0; gad && n<NumGad ; n++ )
- {
- struct NewGadget ng;
-
- ng = NGad[n];
-
- if (NULL == ng.ng_TextAttr)
- ng.ng_TextAttr = GadgetFontAttr;
- ng.ng_VisualInfo = vi;
- ng.ng_LeftEdge = ng.ng_LeftEdge * ScaleX/65535;
- ng.ng_TopEdge = ng.ng_TopEdge * ScaleY/65535;
-
- if (GENERIC_KIND != GadgetTypes[n])
- {
- // Gadgets GENERIC_KIND werden nicht skaliert!
- ng.ng_Width = ng.ng_Width * ScaleX/65535;
- ng.ng_Height = ng.ng_Height * ScaleY/65535;
- }
-
- if (GENERIC_KIND != GadgetTypes[n] && IMAGEBUTTON_KIND != GadgetTypes[n])
- {
- if (ng.ng_GadgetText)
- ng.ng_GadgetText = (STRPTR) GetString((long) ng.ng_GadgetText);
- }
-
- ng.ng_LeftEdge += OffsetX;
- ng.ng_TopEdge += OffsetY;
-
- switch (GadgetTypes[n])
- {
- case PCBAR_KIND:
- GadgetList[n] = gad = CreatePcBar(&ng,
- GA_Previous, gad,
- PB_TextFont, GadgetFontAttr,
- TAG_MORE, GadgetTags,
- TAG_END);
- if (gad)
- RememberBResource(BRES_PCBARGADGET, gad, ResourceList);
- break;
-
- case NOTEBOOK_KIND:
- GadgetList[n] = gad =
- CreateNoteBook(&ng,
- GA_Previous, gad,
- NB_TabFont, GadgetFontAttr,
- TAG_MORE, GadgetTags,
- TAG_END);
- if (gShort)
- {
- EnterGadgetShort(&ng, GadgetTypes[n], GadgetTags, gad, gShort);
- }
- break;
-
- case FRAMEGAD_KIND:
- GadgetList[n] = gad =
- CreateFrameGad(&ng,
- GA_Previous, gad,
- TAG_MORE, GadgetTags,
- TAG_END);
- if (gad)
- RememberBResource(BRES_FRAMEGADGET, gad, ResourceList);
- break;
-
- case ALVGAD_KIND:
- GadgetList[n] = gad =
- CreateALVGad(&ng,
- GA_Previous, gad,
- TAG_MORE, GadgetTags,
- TAG_END);
- if (gad)
- RememberBResource(BRES_ALVGADGET, gad, ResourceList);
- break;
-
- case IMAGEBUTTON_KIND:
- {
- struct GenericGadgetImages *gImg = (struct GenericGadgetImages *) ng.ng_GadgetText;
- struct Image *RenderImage, *SelectedImage;
-
- // Skalierte Images erzeugen
- RenderImage = ScaleImage(gImg->gi_Render, ng.ng_Width, ng.ng_Height);
- if (RenderImage)
- RememberBResource(BRES_SCALEDIMAGE, RenderImage, ResourceList);
-
- SelectedImage = ScaleImage(gImg->gi_Selected, ng.ng_Width, ng.ng_Height);
- if (SelectedImage)
- RememberBResource(BRES_SCALEDIMAGE, SelectedImage, ResourceList);
-
- ng.ng_GadgetText = NULL;
-
- if (RenderImage && SelectedImage)
- {
- GadgetList[n] = gad = CreateGadgetA(GENERIC_KIND, gad, &ng, (struct TagItem *) GadgetTags);
- if (gad)
- {
- gad->GadgetType |= GTYP_BOOLGADGET;
- gad->Activation = GACT_RELVERIFY;
- if (gImg)
- {
- gad->Flags |= GFLG_GADGHIMAGE | GFLG_GADGIMAGE;
- gad->GadgetRender = RenderImage;
- gad->SelectRender = SelectedImage;
- }
- }
- }
- else
- {
- // ScaleImage hat NULL geliefert
- GadgetList[n] = gad = NULL;
- }
- }
- break;
-
- case GENERIC_KIND:
- {
- struct GenericGadgetImages *gImg = (struct GenericGadgetImages *) ng.ng_GadgetText;
-
- ng.ng_GadgetText = NULL;
- if (gImg)
- {
- // Breite + Höhe des Gadgets von den Images übernehmen
- ng.ng_Width = gImg->gi_Render->Width;
- ng.ng_Height = gImg->gi_Render->Height;
- }
- GadgetList[n] = gad = CreateGadgetA(GadgetTypes[n], gad, &ng, (struct TagItem *) GadgetTags);
- if (gad)
- {
- gad->GadgetType |= GTYP_BOOLGADGET;
- gad->Activation = GACT_RELVERIFY;
- if (gImg)
- {
- gad->Flags |= GFLG_GADGHIMAGE | GFLG_GADGIMAGE;
- gad->GadgetRender = gImg->gi_Render;
- gad->SelectRender = gImg->gi_Selected;
- }
- }
- }
- break;
-
- case LISTVIEW_KIND:
- if (n > 0)
- {
- // GTLV_ShowSelected, <StringGadget> nachtragen
- struct TagItem *Tag;
-
- Tag = FindTagItem(GTLV_ShowSelected, (struct TagItem *) GadgetTags);
- if (Tag && 0 != Tag->ti_Data && STRING_KIND == GadgetTypes[n-1])
- Tag->ti_Data = (ULONG) GadgetList[n-1];
-
- }
- GadgetList[n] = gad = CreateGadgetA(GadgetTypes[n], gad, &ng, (struct TagItem *) GadgetTags);
- if (gShort)
- {
- EnterGadgetShort(&ng, GadgetTypes[n], GadgetTags, gad, gShort);
- }
- break;
-
- case STRING_KIND:
- ng.ng_Height = ng.ng_TextAttr->ta_YSize + 6;
- GadgetList[n] = gad = CreateGadgetA(GadgetTypes[n], gad, &ng, (struct TagItem *) GadgetTags);
- if (gShort)
- {
- EnterGadgetShort(&ng, GadgetTypes[n], GadgetTags, gad, gShort);
- }
- break;
-
- default:
- GadgetList[n] = gad = CreateGadgetA(GadgetTypes[n], gad, &ng, (struct TagItem *) GadgetTags);
- if (gShort)
- {
- EnterGadgetShort(&ng, GadgetTypes[n], GadgetTags, gad, gShort);
- }
- break;
- }
-
- while (TAG_END != *GadgetTags)
- GadgetTags += 2;
- GadgetTags++; // TAG_END überlesen
- }
-
- return gad;
- }
-
-
- void CalcGadgetScale(const struct Screen *GadgetScreen, const struct TextFont *GadgetFont,
- ULONG *ScaleX, ULONG *ScaleY,
- UWORD *OffsetX, UWORD *OffsetY,
- short DesignFontWidth, short DesignFontHeight)
- {
- *OffsetX = GadgetScreen->WBorLeft;
- *OffsetY = GadgetScreen->WBorTop + GadgetScreen->RastPort.Font->tf_YSize + 1;
-
- *ScaleX = (65535 * GadgetFont->tf_XSize) / DesignFontWidth;
- if (*ScaleX < 65535)
- *ScaleX = max(65535, 120 * *ScaleX / 100); // bei kleinen Schriften Window etwas breiter lassen
-
- *ScaleY = (65535 * GadgetFont->tf_YSize) / DesignFontHeight;
- if (*ScaleY < 65535)
- *ScaleY = min(65535, 120 * *ScaleY / 100); // bei kleinen Schriften Window etwas höher lassen
- }
-
-
- void SetGadgetPosition(struct Gadget *Gad, short LeftEdge, short TopEdge)
- {
- Gad->LeftEdge = LeftEdge;
- Gad->TopEdge = TopEdge;
-
- if (Gad->Flags & GFLG_EXTENDED)
- {
- struct ExtGadget *eGad;
-
- eGad = (struct ExtGadget *) Gad;
- eGad->BoundsLeftEdge = LeftEdge;
- eGad->BoundsTopEdge = TopEdge;
- }
- }
-
-
- BOOL RememberBResource(enum BResourceType Type, APTR BRes, struct MinList *ResourceList)
- {
- struct BResource *ResRemember;
- BOOL Result = FALSE;
-
- ResRemember = malloc(sizeof(struct BResource));
- if (ResRemember)
- {
- ResRemember->br_Node.ln_Type = NT_USER;
- ResRemember->br_Node.ln_Pri = 0;
- ResRemember->br_Node.ln_Name = NULL;
- ResRemember->br_Type = Type;
- ResRemember->br_Resource = BRes;
-
- AddTail((struct List *) ResourceList, &ResRemember->br_Node);
- }
-
- return Result;
- }
-
-
- void FreeBResources(struct MinList *ResourceList)
- {
- struct BResource *BRes;
-
- do {
- BRes = (struct BResource *) RemHead((struct List *) ResourceList);
- if (BRes)
- {
- switch (BRes->br_Type)
- {
- case BRES_SCALEDIMAGE:
- DiscardScaledImage((struct Image *) BRes->br_Resource);
- break;
- case BRES_ALVGADGET:
- DestroyALVGad((struct Gadget *) BRes->br_Resource);
- break;
- case BRES_FRAMEGADGET:
- DestroyFrameGad((struct Gadget *) BRes->br_Resource);
- break;
- case BRES_PCBARGADGET:
- RemovePcBar((struct Gadget *) BRes->br_Resource);
- break;
- }
-
- free(BRes);
- }
- } while (BRes);
- }
-